//-------------------------------------
//让一个元素动起来 
//-------------------------------------
function move(obj, attr, target, step, fn) {
	var num = parseInt(getCss(obj, attr));
	step = num < target ? step : -step;
	clearInterval(obj.iTimer);
	obj.iTimer = setInterval(function () {
		num = num + step;
		if (num > target && step > 0 || num < target && step < 0) {
			num = target;
		}
		obj.style[attr] = num + 'px';
		if (num == target) {
			clearInterval(obj.iTimer);
			fn && fn();
		}
	}, 20);

};

//-------------------------------------
// 获取计算后样式
//-------------------------------------
function getCss(obj, attr) {
	return parseFloat(obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr]);
}

//-------------------------------------
// 随机整数[x, y]
//-------------------------------------
function ranNum(x, y) {
	return Math.floor(Math.random() * (y - x + 1) + x);
}

//-------------------------------------
// 随机颜色
//-------------------------------------
function ranColor() {
	return "rgb(" + ranNum(0, 255) + ", " + ranNum(0, 255) + ", " + ranNum(0, 255) + ")";
}

//-------------------------------------
// 绑定事件
//-------------------------------------
function addEvent(obj, EType, fun) {
	if (obj.addEventListener) {
		obj.addEventListener(EType, fun);
	} else if (obj.attachEvent) {
		obj.attachEvent("on" + EType, fun);
	} else {
		obj["on" + EType] = fun;
	}
}

//-------------------------------------
// 移除元素事件
//-------------------------------------
function removeEvent(obj, EType, fun) {
	if (obj.removeEventListener) {
		obj.removeEventListener(EType, fun);
	} else if (obj.detachEvent) {
		obj.detachEvent("on" + EType, fun);
	} else {
		obj["on" + EType] = null;
	}
}

//-------------------------------------
// 取消默认行为
//-------------------------------------
function preventDefaultFun(event) {
	if (event.preventDefault) {
		event.preventDefault();
	} else {
		event.returnValue = false;
	}
}

//-------------------------------------
// 阻止事件传播
//-------------------------------------
function stopPropagationFun(event) {
	if (event.stopPropagation) {
		event.stopPropagation();
	} else {
		event.cancelBubble = true;
	}
}

//-------------------------------------
// cookie 的封装
//-------------------------------------
function addCookie(kName, kValue, kSeconds) {
	document.cookie = kName + "=" + kValue + ";max-age=" + kSeconds;
}

//-------------------------------------
// 删除cookie
//-------------------------------------
function deleteCookie(kName) {
	addCookie(kName, "", -1);
}

//-------------------------------------
// 修改cookie值
//-------------------------------------
function chageCookie(kName, kValue, kSec) {
	addCookie(kName, kValue, kSec);
}

//-------------------------------------
// 获取cookie值
//-------------------------------------
function findCookie(kName) {
	// 获取cookie
	var cookieStr = document.cookie; // user=123; pass=345; name=zs
	// 分割字符串
	var cookieArr = cookieStr.split(";"); // [user=123, pass=345, name=zs]
	// 遍历字符串数组
	for (var i = 0; i < cookieArr.length; i++) {
		// 去除两端空格
		cookieArr[i] = cookieArr[i].trim(); // user=123
		// 再次分割 cookieArr[i]
		var kvStr = cookieArr[i].split("="); // [user, 123]
		if (kvStr[0] == kName) {
			// 如果 数组中第一个值(即, key值) 与传入的 kName参数 一致则返回数组中的第二个值(即, value值)
			return kvStr[1];
		}
	}

	// 如果遍历完都没有找到对应的 key 则返回 null
	return null;
}

//-------------------------------------
// 获取所有 cookie
//-------------------------------------
function getAllCookies() {
	var cookieObj = {};
	// 获取cookie
	var cookieStr = document.cookie; // user=123; pass=345; name=zs
	// 分割字符串
	var cookieArr = cookieStr.split(";"); // [user=123, pass=345, name=zs]
	// 遍历字符串数组
	for (var i = 0; i < cookieArr.length; i++) {
		// 去除两端空格
		cookieArr[i] = cookieArr[i].trim(); // user=123
		var kvStr = cookieArr[i].split("="); // [user,123]
		cookieObj[kvStr[0]] = kvStr[1]; // {user:123}
	}
	// user=123; pass=345; name=zs
	// {user:123, pass:345, name:zs}
	return cookieObj;
}
// 调用方法
// var cObj - getAllCookies();
// console.log(cObj.user)

//-------------------------------------
//十六进制颜色值域RGB格式颜色值之间的相互转换
//-------------------------------------
//十六进制颜色值的正则表达式
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
/*RGB颜色转换为16进制*/
String.prototype.colorHex = function () {
	var that = this;
	if (/^(rgb|RGB)/.test(that)) {
		var aColor = that.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
		var strHex = "#";
		for (var i = 0; i < aColor.length; i++) {
			var hex = Number(aColor[i]).toString(16);
			if (hex === "0") {
				hex += hex;
			}
			strHex += hex;
		}
		if (strHex.length !== 7) {
			strHex = that;
		}
		return strHex;
	} else if (reg.test(that)) {
		var aNum = that.replace(/#/, "").split("");
		if (aNum.length === 6) {
			return that;
		} else if (aNum.length === 3) {
			var numHex = "#";
			for (var i = 0; i < aNum.length; i += 1) {
				numHex += (aNum[i] + aNum[i]);
			}
			return numHex;
		}
	} else {
		return that;
	}
};

//-------------------------------------
/*16进制颜色转为RGB格式*/
//-------------------------------------
String.prototype.colorRgb = function () {
	var sColor = this.toLowerCase();
	if (sColor && reg.test(sColor)) {
		if (sColor.length === 4) {
			var sColorNew = "#";
			for (var i = 1; i < 4; i += 1) {
				sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
			}
			sColor = sColorNew;
		}
		//处理六位的颜色值
		var sColorChange = [];
		for (var i = 1; i < 7; i += 2) {
			sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
		}
		return "RGB(" + sColorChange.join(",") + ")";
	} else {
		return sColor;
	}
};
// 调用方法
// var sRgb = "RGB(255, 255, 255)" , sHex = "#00538b";
// var sHexColor = sRgb.colorHex();//转换为十六进制方法
// var sRgbColor = sHex.colorRgb();//转为RGB颜色值的方法

//-------------------------------------
// 封装函数, 处理字符串格式
//-------------------------------------
function dealStrStyle(str) {
	var strs = str.split(" ");
	for (var i = 0; i < strs.length; i++) {
		if (strs[i] == "") {
			strs.splice(i, 1);
			i--;
		}
	}
	// 返回调整好格式的字符串
	return strs.join(" ");
}

//-------------------------------------
// 根据class获取页面元素
//-------------------------------------
function getElesByClassName(obj, classN) {
	var arr = [];
	if (obj.getElementsByClassName) {
		arr = obj.getElementsByClassName(classN);
	} else {
		var eleArr = obj.getElementsByTagName("*");
		for (var i = 0; i < eleArr.length; i++) {
			if (eleArr[i].className == classN) {
				arr.push(eleArr[i]);
			}
		}
	}
	return arr;
}

//-------------------------------------
// 封装函数, 根据 选择器 获取页面元素
//-------------------------------------
// sel 是选择器: #one, .two, div
function $(sel) {
	// sel ---- .oneDiv .one p
	// 整理选择器格式
	sel = dealStrStyle(sel);
	// 分割选择器
	var sels = sel.split(" ");// [.oneDiv, .one, p]
	// sels[0] --- .oneDiv  ------ document
	// sels[1] --- .one -- 第一次查找之后得到的子元素中再查找
	// sels[2] --- p ----- 第二次查找之后得到的子元素中再查找
	var parent = [document];
	var child = [];
	for (var i = 0; i < sels.length; i++) {
		var seleter = sels[i];// .oneDiv
		// 对上次查找得到的父元素进行遍历
		for (var j = 0; j < parent.length; j++) {
			// 获取 seleter 中的第一个字母
			var firstLetter = seleter.substring(0, 1);
			if (firstLetter == "#") {
				// 获取选择器(删掉#)
				seleter = seleter.substring(1);
				// 根据 id 获取元素
				var ele = parent[j].getElementById(seleter);
				// 添加到保存子元素的数组中
				child.push(ele);
			} else if (firstLetter == ".") {
				// 获取选择器(删掉.)
				seleter = seleter.substring(1);
				// 根据 class 获取元素
				var childEles = getElesByClassName(parent[j], seleter);
				// 添加给 child
				transferArray(child, childEles);
			} else {
				// 根据标签名查询
				var childEles = parent[j].getElementsByTagName(seleter);
				// 添加给 child
				transferArray(child, childEles);
			}
		}
		// 代码执行到此处说明给上一次的父元素都遍历完了
		// child 中的值 传递给 parent
		parent = [];
		transferArray(parent, child);
		child = [];
	}
	// 代码走到此处说明选择器遍历结束, 此时parent数组中存储的就是我们想要查找的元素
	return parent;
}

//-------------------------------------
// 将一个数组中的值, 添加给另一个数组
//-------------------------------------
function transferArray(desArr, souArr) {
	for (var i = 0; i < souArr.length; i++) {
		desArr.push(souArr[i]);
	}
}

//-------------------------------------------
// 根据简单选择器获取页面元素(#one, .one, div, p)
//-------------------------------------------
function getEle(sel) {
	// 截取选择器 sel 的第一个字母
	var firstLetter = sel.substring(0, 1);
	if (firstLetter == "#") {
		// 通过 id 获取页面元素
		var ele = document.getElementById(sel);
		return ele;
	} else if (firstLetter == ".") {
		// 通过 class 获取页面元素
		var eles = getElesByClassName(document, sel);
		return eles;
	} else {
		// 通过 标签名 获取元素
		var eles = document.getElementsByTagName(sel);
		return eles;
	}
	return null;
}

//-------------------------------------
// 浏览器嗅探
//-------------------------------------
function browserNav(bro, fun) {
	if (navigator.userAgent.indexOf(bro) != -1) {
		fun();
	}
}
// 调用方法
// browserNav("Chrome", function() {
// 	alert("Chrome");
// });

//-------------------------------------
// 浏览器窗口宽度，window 窗口宽度兼容性处理
//-------------------------------------
function winWidth() {
	/*
	  IE 9+, chrome, Safari, Firefox, Opera中获取浏览器窗口宽度: window.innerWidth
	  在 IE6, 7, 8中获取浏览器窗口宽度: document.documentElement.clientWidth || document.body.clientWidth;
	*/
	return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
}
// 浏览器窗口高度
function winHeight() {
	return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
}
// 调用方法
// var winth = winWidth();
// var height = winHeight();

/**
 * AJAX
 */

//-------------------------------------
// get 同步请求
//-------------------------------------
function ajaxGetSync(urlS, parms, sucsFun, errFun) {
	// 1, 创建请求对象
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else {
		// IE 5, 6
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// 2, 配置请求(同步)
	xhr.open("get", urlS + "?" + parms, false);
	// 3, 发送请求
	xhr.send(null);
	// 4, 处理请求结果
	if (xhr.status >= 200 && xhr.status < 300 || 304 == xhr.status) {
		sucsFun(xhr);
	} else{
		errFun();
	}
}

//-------------------------------------
// get 异步请求
//-------------------------------------
function ajaxGetAsync(urlS, parms, sucsFun, errFun) {
	// 1, 创建请求对象
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else {
		// IE 5, 6
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// 2, 配置请求(异步)
	xhr.open("get", urlS + "?" + parms);
	// 3, 发送请求
	xhr.send(null);
	// 4, 处理请求结果
	xhr.onreadystatechange = function() {
		if (4 == xhr.readyState) {
			if (xhr.status >= 200 && xhr.status < 300 || 304 == xhr.status) {
				sucsFun(xhr);
			} else{
				errFun();
			}
		}
	}
}

//-------------------------------------
// post 同步请求
//-------------------------------------
function ajaxPostSync(urlS, parms, sucsFun, errFun) {
	// 1, 创建请求对象
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else {
		// IE 5, 6
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// 2, 配置请求(同步)
	xhr.open("post", urlS, false);
	// 3, 设置请求头
	xhr.setRequestHeader("CONTENT-TYPE", "application/x-www-form-urlencoded");
	// 4, 发送请求
	xhr.send(parms);
	// 5, 处理请求结果
	if (xhr.status >= 200 && xhr.status < 300 || 304 == xhr.status) {
		sucsFun(xhr);
	} else{
		errFun();
	}
}

//-------------------------------------
// post 异步请求
//-------------------------------------
function ajaxPostAsync(urlS, parms, sucsFun, errFun) {
	// 1, 创建请求对象
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else {
		// IE 5, 6
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// 2, 配置请求(异步)
	xhr.open("post", urlS);
	// 3, 设置请求头
	xhr.setRequestHeader("CONTENT-TYPE", "application/x-www-form-urlencoded");
	// 4, 发送请求
	xhr.send(parms);
	// 5, 处理请求结果
	xhr.onreadystatechange = function() {
		if (4 == xhr.readyState) {
			if (xhr.status >= 200 && xhr.status < 300 || 304 == xhr.status) {
				sucsFun(xhr);
			} else{
				errFun();
			}
		}
	}
}

//-------------------------------------
// ajax 同步请求
//-------------------------------------
function ajaxSync(ajaxType, urlS, parms, sucsFun, errFun) {
	if (ajaxType == "get" || ajaxType == "GET") {
		// get 同步请求
		ajaxGetSync(urlS, parms, sucsFun, errFun);
	} else if (ajaxType == "post" || ajaxType == "POST") {
		// post 同步请求
		ajaxPostSync(urlS, parms, sucsFun, errFun);
	}
}

//-------------------------------------
// ajax 异步请求
//-------------------------------------
function ajaxAsync(ajaxType, urlS, parms, sucsFun, errFun) {
	if (ajaxType == "get" || ajaxType == "GET") {
		// get 异步请求
		ajaxGetAsync(urlS, parms, sucsFun, errFun);
	} else if (ajaxType == "post" || ajaxType == "POST") {
		// post 异步请求
		ajaxPostAsync(urlS, parms, sucsFun, errFun);
	}
}